package cn.lxb.web.starter.template.controller;

import cn.lxb.web.starter.template.domain.dto.ConvertDTO;
import cn.lxb.web.starter.template.service.BaseService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

/**
 * 控制器接口
 *
 * @param <E>  实体对象类型
 * @param <S>  服务接口类型
 * @param <PK> 实体主键类型
 * @author 54lxb
 * @since 2019-11-20
 */
public interface SaveController<D, E extends ConvertDTO<D>, S extends BaseService<E, PK>, PK> extends BaseController<E, S> {

    /**
     * 添加对象
     *
     * @param dto dto对象
     * @return 添加的dto对象
     */
    @ApiOperation("添加")
    @PostMapping
    default D save(@RequestBody D dto) {
        E entity = newEntity();
        BeanUtils.copyProperties(dto, entity);
        getService().insert(entity);
        return entity.toDTO();
    }

    /**
     * 保存前置环绕
     *
     * @param dto    dto对象
     * @param entity 实体对象
     */
    void saveBefore(D dto, E entity);

}
